#include "comm.hpp"
#include <iostream>
#include <cstring>
Init init;
int main()
{

  // 创建公共的key值
  key_t k = ftok(PATH_NAME, PROJ_ID);
  assert(k != -1);
  Log("create key success ", Debug) << "server key:" << k << endl;
  sleep(1);
  // 创建一个全新的共享内存
  //使用IPC_CREAT和IPC_EXCL:如果底层不存在，创建之，并返回；如果存在，出错返回。可以保证每一次创建的都是新的共享内存
  int shmid = shmget(k, SHM_SIZE, IPC_CREAT | IPC_EXCL | 0666);
  if (shmid == -1)
  {
    perror("shmget");
    exit(1);
  }
  Log("create shm success ", Debug) << "shmid:" << shmid << endl;
  sleep(1);
  // 将指定的共享内存，挂接到自己的地址空间
  char *shmaddr = (char *)shmat(shmid, nullptr, 0);
  Log(" attach shm success ", Debug) << "shmid:" << shmid << endl;
  sleep(1);
  // 通信1
  // 将shm想象成为一个大的数组
  /* while (true)
  {
    cout << shmaddr << endl;//直接将共享内存中的内容输出
    if (strcmp(shmaddr, "quit") == 0)//quit为结束标志
    {
      break;
    }
    sleep(1);
  } */

  // 通信2 利用命名管道实现共享内存的访问控制
   int fd=OPEN_FIFO(FIFE_NAME,READ);
   cout<<"server fd:"<<fd<<endl;
  while(true)
   {
      wait(fd);
      cout<<shmaddr<<endl;
      if(strcmp(shmaddr,"quit")==0)
      {
            break;
      }
  }
  CLOSE_FIFO(fd);
   
 
  // 将指定的共享内存，从自己的地址空间中去关联
  int n = shmdt(shmaddr);
  assert(n != -1);
  (void)n;
  Log(" detach shm success ", Debug) << "shmid:" << shmid << endl;

  // 删除共享内存，IPC_RMID即便是有进程和当下的shm挂接，依旧删除共享内存
  int s = shmctl(shmid, IPC_RMID, nullptr);
  assert(s != -1);
  (void)n;
  Log(" delete shm success ", Debug) << "shmid:" << shmid << endl;
  return 0;
}